package com.jwj.testback.ws;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
@ServerEndpoint(value = "/websocket")
public class JqWebSocket {
//    MyThread thread1=new MyThread();
//
//    Thread thread=new Thread(thread1);

    private Integer linkCount=0;
    //用来存放每个客户端对应的MyWebSocket对象
    private static CopyOnWriteArraySet<JqWebSocket> webSockets = new CopyOnWriteArraySet<JqWebSocket>();
    private Session session = null;


    /**
     * @ClassName: onOpen
     * @Description: 开启连接的操作
     */
    @OnOpen
    public void onOpen(Session session) throws IOException {
        this.session = session;

        webSockets.add(this);
        // 开启一个线程对数据库中的数据进行轮询
//        thread.start();
        System.out.println("1.进入后台方法onOpen");

    }

    /**
     * 给服务器发送消息告知数据库发生变化
     *
     */
    @OnMessage
    public void onMessage(int count) {
        System.out.println("2.进入后台方法onMessage"+"发生变化"+count);

        try {
            sendMessage();//进入内部类，这个方法用户自定义
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 此方法是被调用的方法，所以没注解，这里才是真正处理逻辑的地方，可以给前台传输你想要传输的内容。
     *
     * @throws IOException
     *             发送自定义信号，表示告诉前台，数据库发生改变了，需要刷新
     */
    public static void sendMessage() throws IOException {
        System.out.println("发送消息");
        // 群发消息
        for (JqWebSocket item : webSockets) {
            item.session.getBasicRemote().sendText("1");
        }
    }
        /**
         * @ClassName: onClose
         * @Description: 连接关闭的操作
         */
        @OnClose
        public void onClose () {
            System.out.println("4.关闭 onClose");
//            thread1.stopMe();
            webSockets.remove(this);
        }

        /**
         * 出错操作
         *
         * @param error
         */
        @OnError
        public void onError (Throwable error){
            System.out.println("5.进入后台方法onError");
            error.printStackTrace();
        }
    }
